package com.penghaisoft.microwms.material.web.insidewarehouse.controller;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.controller.BaseController;
import com.penghaisoft.microwms.common.dto.Resp;
import com.penghaisoft.microwms.common.dto.TransResult;
import com.penghaisoft.microwms.common.page.Pager;
import com.penghaisoft.microwms.common.service.IWmsCommonService;
import com.penghaisoft.microwms.common.wms.model.RawContractChangePlan;
import com.penghaisoft.microwms.material.web.insidewarehouse.service.IRawContractChangePlanService;

import lombok.extern.slf4j.Slf4j;

/** 
 * @Package com.penghaisoft.microwms.material.web.insidewarehouse.controller
 * @ClassName: RawContractChangePlanController
 * @Description: 原材料合同变更计划表
 * @author luoteng
 * @date 2019年3月6日 上午10:35:13
 */
@RestController
@RequestMapping(value = "/rawContractChangePlan")
@Slf4j
public class RawContractChangePlanController extends BaseController {
	
		@Autowired
		private IRawContractChangePlanService iRawContractChangePlanService;
		
		@Autowired
		private IWmsCommonService wmsCommonService;

		/**
		 * @Description: TODO
		 * @param @param page
		 * @param @param rows
		 * @param @param rawContractChange
		 * @param @return   
		 * @return TransResult
		 * @author lengxf
		 * @date 2018年9月14日 下午4:45:17
		 */
		@PostMapping("list")
		public TransResult list(@RequestParam(name = "page", defaultValue = "1") int page,
                            @RequestParam(name = "rows", defaultValue = "10") int rows,RawContractChangePlan rawContractChangePlan) {
			Pager<RawContractChangePlan> result = iRawContractChangePlanService.findListByCondition(page,rows,rawContractChangePlan);
			return success(result);
		}
		
		/**
	     * @Description 原材料合同借用创建
	     * @copy luoteng
	     * @param list
	     * @return TransResult
	     */
	    @PostMapping("insert")
	    public TransResult create(@RequestBody List<RawContractChangePlan> list) {
	        TransResult transResult = new TransResult();
	        if(list == null || list.isEmpty()){
	            transResult.setCode(Constant.FAIL);
	            transResult.setMsg("请选择型号及数量！");
	            return transResult;
	        }else{
	        	String sellOutNo = wmsCommonService.getProShortSeq5(Constant.SEQ_PREFIX_SHORT_YJY, Constant.SEQ_PREFIX_SHORT_REDIS_RAW_YJY, 1).get(0);
	            Resp resp = iRawContractChangePlanService.insert(list, sellOutNo, getLoginName());
	            transResult.setCode(resp.getCode());
	            transResult.setMsg(resp.getMsg());
	        }
	        
	        return transResult;
	    }
	    
	    /**
	     * @Title: audit
	     * @Description: 原材料合同借用审核
	     * @date 2019年3月6日 下午3:24:21
	     * @author luoteng
	     * @param rawContractChangePlan
	     * @return TransResult   
	     */
	    @PostMapping("audit")
	    public TransResult audit(RawContractChangePlan rawContractChangePlan) {
	    	TransResult transResult = new TransResult();
	    	rawContractChangePlan.setLastModifiedBy(getLoginName());
	    	rawContractChangePlan.setGmtModified(new Date());
	    	
	    	RawContractChangePlan ob = new RawContractChangePlan();
			ob.setActiveFlag("1");
			ob.setContractChangePlanNo(rawContractChangePlan.getContractChangePlanNo());

			List<RawContractChangePlan> list  = iRawContractChangePlanService.queryListByAny(ob);
			if(list != null && !list.isEmpty()){
				RawContractChangePlan tmp = list.get(0);
//				状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
				if(tmp.getStatus().equals("3") || tmp.getStatus().equals("4") || tmp.getStatus().equals("5")){
	    			transResult.setCode(Constant.FAIL);
	    	        transResult.setMsg("只有创建、通过、驳回状态下才能审核！");
	    	        return transResult;
	    		}
			}
			
			ob.setStatus(rawContractChangePlan.getStatus());
			ob.setLastModifiedBy(getLoginName());
			ob.setGmtModified(new Date());
			
	    	Resp resp = iRawContractChangePlanService.updateByPlanNo(ob);
	    	transResult.setCode(resp.getCode());
	        transResult.setMsg(resp.getMsg());
	    	return transResult;
	    }
	    
	    /**
	     * @Title: del
	     * @Description: 原材料合同借用 删除
	     * @date 2019年3月6日 下午3:24:51
	     * @author luoteng
	     * @param rawContractChangePlan
	     * @return TransResult   
	     */
	    @PostMapping("del")
	 	public TransResult del(RawContractChangePlan rawContractChangePlan) {
	 		TransResult transResult = new TransResult();
	 		transResult.setCode(Constant.SUCCESS);
	 		RawContractChangePlan ob = new RawContractChangePlan();
			ob.setActiveFlag("1");
			ob.setRawContractChangePlanId(rawContractChangePlan.getRawContractChangePlanId());

			List<RawContractChangePlan> list  = iRawContractChangePlanService.queryListByAny(ob);
	 		if(list != null && !list.isEmpty()){
	 			RawContractChangePlan tmp = list.get(0);
	 			
//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
				if(!tmp.getStatus().equals("0")){
	    			transResult.setCode(Constant.FAIL);
	    	        transResult.setMsg("只有创建状态下才能删除！");
	    	        return transResult;
	    		}
	 			
//	 			BigDecimal realAmount = tmp.getAmount() == null ? BigDecimal.ZERO : tmp.getAmount();
//	 			
//	 			if(realAmount.compareTo(BigDecimal.ZERO) > 0){
//	 				transResult.setCode(Constant.FAIL);
//	 				transResult.setMsg("发货中的销售出库单不能删除！若想删除，请先通知仓库退扫已扫码记录！");
//	 				return transResult;
//	 			}
	 		}
	 		
	 		rawContractChangePlan.setActiveFlag("0");
	 		rawContractChangePlan.setLastModifiedBy(getLoginName());
	 		rawContractChangePlan.setGmtModified(new Date());
	 		try{
	 			iRawContractChangePlanService.update(rawContractChangePlan);
	 		}catch(RuntimeException e){
	 			transResult.setCode(Constant.FAIL);
	 			transResult.setMsg(e.getMessage());
	 		}
	 		
	 		
	 		return transResult;
	 	}
	    
	    /**
	     * @Title: getInfo
	     * @Description: 根据主键查看详情
	     * @date 2019年3月6日 下午5:11:25
	     * @author luoteng
	     * @param rawContractChangePlanId
	     * @return TransResult   
	     */
	    @GetMapping("get/id/{rawContractChangePlanId}")
		public TransResult getInfo(@PathVariable("rawContractChangePlanId")String rawContractChangePlanId) {
			TransResult transResult = new TransResult();
			transResult.setCode(Constant.SUCCESS);
			
			RawContractChangePlan ob = new RawContractChangePlan();
			ob.setActiveFlag("1");
			ob.setRawContractChangePlanId(Integer.parseInt(rawContractChangePlanId));

			List<RawContractChangePlan> list  = iRawContractChangePlanService.queryListByAny(ob);
			if(list != null && !list.isEmpty()){
				RawContractChangePlan tmp = list.get(0);
//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
				if(!tmp.getStatus().equals("5")){
					transResult.setCode(Constant.FAIL);
					transResult.setMsg("只有确认完成状态下才能归还！");
					return transResult;
				}
				transResult.setData(tmp);
			}
			
			return transResult;
		}
	    
	    /**
	     * @Title: back
	     * @Description: 归还
	     * @date 2019年3月6日 下午5:35:18
	     * @author luoteng
	     * @param rawContractChangePlan
	     * @return TransResult   
	     */
	    @PostMapping("back/update")
		public TransResult back(RawContractChangePlan rawContractChangePlan) {
			TransResult transResult = new TransResult();
			
			String sellOutNo = wmsCommonService.getProShortSeq5(Constant.SEQ_PREFIX_SHORT_YJY, Constant.SEQ_PREFIX_SHORT_REDIS_RAW_YJY, 1).get(0);
			
			Resp resp = iRawContractChangePlanService.backUpdate(rawContractChangePlan, sellOutNo, getLoginName());
			transResult.setCode(resp.getCode());
			transResult.setMsg(resp.getMsg());
			
			return transResult;
		}
	    
	    /**  
	     * @Title: makeNewBarcode
	     * @Description:   变更合同号的物料重新打印条码
	     * @author Lengxf  
	     * @date 2019年3月26日    
	     */  
	    @PostMapping("makeNewBarCode")
	    public TransResult makeNewBarcode(RawContractChangePlan rawContractChangePlan){
	    	// rawContractChangePlan 对象接收新合同号和类型两个字段，确定为一条数据
	    	TransResult result = new TransResult();
	    	Resp resp = iRawContractChangePlanService.makeNewBarcode(rawContractChangePlan);
	    	result.setCode(resp.getCode());
	    	result.setMsg(resp.getMsg());
	    	return result;
	    }
	    
	    /**
	     * @Title: getInfo
	     * @Description: 根据主键查看详情【修改用】
	     * @date 2019年3月6日 下午5:11:25
	     * @author luoteng
	     * @param rawContractChangePlanId
	     * @return TransResult   
	     */
	    @GetMapping("edit/get/id/{rawContractChangePlanId}")
		public TransResult getEditInfo(@PathVariable("rawContractChangePlanId")String rawContractChangePlanId) {
			TransResult transResult = new TransResult();
			transResult.setCode(Constant.SUCCESS);
			
			RawContractChangePlan ob = new RawContractChangePlan();
			ob.setActiveFlag("1");
			ob.setRawContractChangePlanId(Integer.parseInt(rawContractChangePlanId));

			List<RawContractChangePlan> list  = iRawContractChangePlanService.queryListByAny(ob);
			if(list != null && !list.isEmpty()){
				RawContractChangePlan tmp = list.get(0);
//	 			状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
				if(tmp.getStatus().equals("5")){
					transResult.setCode(Constant.FAIL);
					transResult.setMsg("确认完成状态下不能修改！");
					return transResult;
				}
				transResult.setData(tmp);
			}
			
			return transResult;
		}
	    
	    /**
	     * @Title: planUpdate
	     * @Description: 修改
	     * @date 2019年4月2日 上午11:32:27
	     * @author luoteng
	     * @param proContractChangePlan
	     * @return TransResult   
	     */
	    @PostMapping("edit/update")
		public TransResult planUpdate(RawContractChangePlan proContractChangePlan) {
			TransResult transResult = new TransResult();
			transResult.setCode(Constant.SUCCESS);
			
			RawContractChangePlan ob = new RawContractChangePlan();
			ob.setActiveFlag("1");
			ob.setRawContractChangePlanId(proContractChangePlan.getRawContractChangePlanId());

			List<RawContractChangePlan> list  = iRawContractChangePlanService.queryListByAny(ob);
			if(list != null && !list.isEmpty()){
				RawContractChangePlan tmp = list.get(0);
				BigDecimal realAmount = tmp.getAmount() == null ? BigDecimal.ZERO : tmp.getAmount();
				BigDecimal modiAmount = proContractChangePlan.getRequireAmount() == null ? BigDecimal.ZERO : proContractChangePlan.getRequireAmount();
//				状态：0：创建 1：通过 2：驳回 3：扫码中 4：扫码完成 5：确认完成
				if(tmp.getStatus() != null && tmp.getStatus().equals("5")){
					transResult.setCode(Constant.FAIL);
					transResult.setMsg("状态为确认完成的合同变更单不能修改！");
					return transResult;
				}else if(realAmount.compareTo(modiAmount) > 0){
					transResult.setCode(Constant.FAIL);
					transResult.setMsg("合同变更单中该型号的需求数量不能修改小于当前实际数量！");
					return transResult;
				}
				
				if(!tmp.getModel().equals(proContractChangePlan.getModel())){
					if(realAmount.compareTo(BigDecimal.ZERO) > 0){
						transResult.setCode(Constant.FAIL);
						transResult.setMsg("扫码中的合同变更单不能修改型号！若想修改型号，请先通知仓库退扫已扫码记录！");
						return transResult;
					}
				}
			}
			
			proContractChangePlan.setLastModifiedBy(getLoginName());
			proContractChangePlan.setGmtModified(new Date());
			try{
				iRawContractChangePlanService.updateNew(proContractChangePlan);
			}catch(RuntimeException e){
				transResult.setCode(Constant.FAIL);
				transResult.setMsg(e.getMessage());
			}
			
			return transResult;
		}
}
